import { createParamDecorator, ExecutionContext } from '@nestjs/common';
import * as Useragent from 'useragent';
import { GetNowDate } from 'src/common/utils';

// 客户端信息装饰器
export const ClientInfo = createParamDecorator((data: unknown, ctx: ExecutionContext) => {
  // 获取请求对象
  const request = ctx.switchToHttp().getRequest();
  // 解析用户代理信息
  const agent = Useragent.parse(request.headers['user-agent']);
  // 获取操作系统
  const os = agent.os.toJSON().family;
  // 获取浏览器信息
  const browser = agent.toAgent();
  // 获取客户端信息
  const clientInfo = {
    // 获取用户代理
    userAgent: request.headers['user-agent'],
    // 获取IP地址
    ipaddr: request.ip,
    // 获取浏览器信息
    browser: browser,
    // 获取操作系统
    os: os,
    // 获取登录位置
    loginLocation: '',
    // 获取当前日期时间
    dateTime: GetNowDate(),
    // 获取用户名
    userName: request.user?.user?.userName,
  };

  return clientInfo;
});

/**
 * 客户端信息类型
 */
export type ClientInfoDto = {
  userAgent: string; // 用户代理
  ipaddr: string; // IP地址
  browser: string; // 浏览器信息
  os: string; // 操作系统
  loginLocation: string; // 登录位置
  dateTime: string; // 当前日期时间
  userName?: string; // 用户名
};
